package br.com.vti.leilao.model.dao;

import br.com.vti.leilao.model.entity.Model;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;

/** 
 * Interface para manipulação e persistencia do objeto de um dominio.
 * 
 * @author Ednardo Rubens
 * 
 * @param <E> entidade extends Model
 * 
 */
public interface Dao<E extends Model<?>> extends Serializable {

    /**
     * Retorna o EntityManager utilizado pela classe de persistência
     * @return EntityManager
     * @throws SQLException  
     */
    EntityManager getEntityManager() throws SQLException;

    /**
     * Seta o entityManager utilizado pela classe de persistência
     * @param entityManager entityManager
     * @throws SQLException  
     */
    void setEntityManager(EntityManager entityManager) throws SQLException;

    /**
     * Método reponsável pela inclusão de uma entidade no banco
     * @param entidade Entidade
     * @throws SQLException  
     */
    void inserir(E entidade) throws SQLException;

    /**
     * Método reponsável pela atualização de uma entidade no banco
     * @param entidade Entidade
     * @throws SQLException  
     */
    void atualizar(E entidade) throws SQLException;

    /**
     * Método reponsável pela exclusão de uma entidade no banco
     * @param entidade Entidade
     * @throws SQLException  
     */
    void remover(E entidade) throws SQLException;

    /**
     * Procura uma entidade no banco por id.
     * @param entidade Entidade buscada no banco
     * @return entidade
     * @throws SQLException  
     */
    E procurarPorId(E entidade) throws SQLException;

    /**
     * Lista todos os dados. do banco por hql. Sobrecarga do listarPorHql,
     * permitindo informar uma lista de parâmetros
     * @param hql Hql de busca no banco
     * @param parametros Mapa contendo os parâmetros necessários
     * @param maxResults Quantidade máxima de registros
     * @return lista de entidades
     * @throws SQLException  
     */
    List<E> listarPorHql(String hql, Map<String, Object> parametros, int maxResults) throws SQLException;

    /**
     * Lista todos os dados. do banco por hql. Sobrecarga do listarPorHql,
     * permitindo informar uma lista de parâmetros
     * @param hql Hql de busca no banco
     * @param parametros Mapa contendo os parâmetros necessários
     * @param maxResults Quantidade máxima de registros
     * @return lista de entidades
     * @throws SQLException  
     */
    List<Object[]> consultarPorHql(String hql, Map<String, Object> parametros, int maxResults) throws SQLException;

    /**
     * Procura uma entidade no banco baseada na entidade recebida
     * @param entidade Entidade buscada no banco
     * @param maxResults Quantidade máxima de registros
     * @return lista de entidades
     * @throws SQLException  
     */
    List<E> listarPorExemplo(E entidade, int maxResults) throws SQLException;

    /**
     * Retorna uma lista de entidade pra ser utilizada num comboBox
     * @param classe Classe da entidade buscada no banco
     * @return lista de entidades
     * @throws SQLException  
     */
    List<E> listarParaCombo(Class<E> classe) throws SQLException;
    
}